#ifndef _BAG_H_
#define _BAG_H_

#include "../Interface/Dispatcher.h"
#include "../CustomDefine/CustomMessage.h"
#include "../Interface/GameHandle.h"
#include "../CustomDefine/PropName.h"

//背包类型
enum BAG_TYPE
{
	BAG_TYPE_EQUIP = 1,			//装备栏
	BAG_TYPE_BAG,				//背包
	BAG_TYPE_STORE				//仓库
};

//物品类型
enum ITEM_TYPE
{
	ITEM_TYPE_EQUIP	= 1,		//装备
	ITEM_TYPE_REAGENT,			//药剂
	ITEM_TYPE_MATERIAL,			//材料
	ITEM_TYPE_QUEST,			//任务物品
	ITEM_TYPE_MISC				//杂物
};

//物品颜色
enum ITEM_COLOR
{
	ITEM_COLOR_WHITE = 1,		//白色
	ITEM_COLOR_BLUE,			//蓝色
	ITEM_COLOR_PURPLE,			//紫色
	ITEM_COLOR_ORANGE			//橙色
};

//物品品质
enum ITEM_QUALITY
{
	ITEM_QUALITY_NORMAL = 1,		//普通
	ITEM_QUALITY_EXCELL,			//优秀
	ITEM_QUALITY_POLISH,			//精良
	ITEM_QUALITY_PERFECT			//完美
};

//物品材质
enum ITEM_MATERIAL
{
	ITEM_MATERIAL_FABRIC = 1,		//布甲
	ITEM_MATERIAL_METAL,			//金属
};

//装备类型
enum EQUIP_TYPE
{
	EQUIP_TYPE_WEAPON	= 1,	//武器
	EQUIP_TYPE_NECK,			//项链
	EQUIP_TYPE_FINGER,			//戒指
	EQUIP_TYPE_TALISMAN,		//护符
	EQUIP_TYPE_HEAD,			//头盔
	EQUIP_TYPE_WEAR,			//衣服
	EQUIP_TYPE_SHOULDERS,		//护肩
	EQUIP_TYPE_CUFF,			//护腕
	EQUIP_TYPE_GLOVE,			//手套
	EQUIP_TYPE_WAIST,			//腰带
	EQUIP_TYPE_PANTS,			//裤子
	EQUIP_TYPE_SHOE				//鞋子
};

//物品绑定类型
enum ITEM_BIND_TYPE
{
	ITEM_BIND_TYPE_NULL		=1,	//无绑定类型
	ITEM_BIND_TYPE_USE		,	//使用绑定
	ITEM_BIND_TYPE_BIND			//绑定
};

#define MAX_EQUIP_SLOT_COUNT	12		// 装备栏数量

#define BAG_INIT_COUNT			5		// 背包数量
#define BAG_ENTEND_COUNT		5		// 拓展背包数量
#define BAG_COUNT				BAG_INIT_COUNT+BAG_ENTEND_COUNT
#define BAG_VER_NUMBER			8		// 8列
#define BAG_COL_NUMBER			3		// 3行
#define MAX_BAG_SLOT_COUNT		BAG_COUNT*BAG_VER_NUMBER*BAG_COL_NUMBER

#define STORE_INIT_COUNT		5		// 仓库数量
#define STORE_ENTEND_COUNT		5		// 拓展仓库数量
#define STORE_COUNT				STORE_INIT_COUNT+STORE_ENTEND_COUNT
#define STORE_VER_NUMBER		8		// 8列
#define STORE_COL_NUMBER		3		// 3行
#define MAX_STORE_SLOT_COUNT	STORE_COUNT*STORE_VER_NUMBER*STORE_COL_NUMBER

/*******************************************************************************************/
// 内存表结构
enum MEM_TAB_FIELDS_ENUM
{
	guid_i,
	entry_i,
	slot_i,
	bind_i,
	stack_i,
	quality_i,
	uneffecttime_i,
	json_i
};

#define MEM_TAB_FIELDS_STR_BAG "string:guid,\
							int:entry,\
							int:slot,\
							int:bind,\
							int:stack,\
							int:quality,\
							int:uneffecttime,\
							string:json"

#define MEM_TAB_FIELDS_STR_STORE MEM_TAB_FIELDS_STR_BAG

#define MEM_TAB_FIELDS_STR_EQUIP MEM_TAB_FIELDS_STR_BAG
/*******************************************************************************************/

#define ITEM_ATTRIBUTE_COUNT 3		//物品的加成属性数量

typedef struct _tagItem
{
	std::string strGuid;		//物品的guid
	DWORD   dwEntry;			//物品的模板id
	UI08	byBagType;			//所在背包
	UI08  	bySlot;				//物品所在背包的slot
	UI16 	wStack;				//物品的数量(这一堆)
	UI08  	byBind;   			//是否绑定
	UI08  	byQuality;			//品质
	DWORD 	dwUneffectTime;		//失效时间
	DWORD	vecBaseAttributeType[3];		//基础属性类型
	DWORD	vecBaseAttributeValue[3];		//基础属性值
	DWORD	vecBonusAttributeType[3];		//附加属性类型
	DWORD	vecBonusAttributeValue[3];		//附加属性值
	DWORD	dwDurability;		//物品的持久
	std::string strJson;		//json
}Item;

// 背包初始化
void OnInitBag(IGame* pScene, UI32 self);

// 背包销毁
void OnUnInitBag(IGame* pScene, UI32 self);

// 向客户端发送背包数据
void SendBagItemsPacket(IGame* pScene, UI32 self, UI08 byBagType);

//
int GetBagItemCount(IGame* pScene, UI32 self, UI08 byBagType, UI16 wEntry, UI08 byIncludeBind = 1, UI08 byIncludeTimeout = 0);

// 能不能存储单个
bool CanStoreItem(IGame* pScene, UI32 self, Item& item);

// 存物品，单个
int StoreItem(IGame* pScene, UI32 self, Item& item);

// 能不能存储一组
bool CanStoreItems(IGame* pScene, UI32 self, std::vector<Item>& vecItems);

// 存储一组物品
int StoreItems(IGame* pScene, UI32 self, std::vector<Item>& vecItems);


// 移动物品
int MoveItem(IGame* pScene, UI32 self, UI08 bySrcBag, UI08 bySrcSlot, UI08 byTarBag, UI08 byTarSlot);

// 拆分物品
int SplitItem(IGame* pScene, UI32 self, UI08 byBag, UI08 bySlot, UI16 wSplitCount);

// 删除物品
int DeleteItem(IGame* pScene, UI32 self, UI08 byBag, UI08 bySlot);

// 删除物品
int DeleteItemByEntry(IGame* pScene, UI32 self, UI08 byBag, DWORD dwEntry, int nCount, UI08 byIncludeBind = 1, UI08 byIncludeTimeout = 0);

// 装备物品
int EquipItem(IGame* pScene, UI32 self, UI08 byBag, UI08 bySlot, UI08 byOnEquip);

// 使用物品
int UseItem(IGame* pScene, UI32 self, UI08 byBag, UI08 bySlot);

// 整理背包
void SortBag(IGame* pScene, UI32 self, UI08 byBagType);

// 拓展背包容量
int ExtendBagSize(IGame* pScene, UI32 self, UI08 byBagType);

// 修理装备
void FixEquip(IGame* pScene, UI32 self, UI08 byBagType, UI08 slot);

// 检查背包更新
void CheckBagUpdate(IGame* pScene, UI32 self);


#endif

